<!DOCTYPE html>
<html lang="en">
<head>
	<meta charset="UTF-8">
	<title>Document</title>
</head>
<body>
<script>
	// 下面，我们用对象表示法定义了一个普通对象，这时他还看不出有任何被寄生的可能性
	var twoD = {
		name: '2D shape',
		dimensions: 2
	};

	// 然后我们来编写用于创建triangle对象的函数
	// -	将twoD对象克隆近一个叫做that的对象，这一步可以使用我们之前所讨论过的任何方法，例如使用object()函数或者执行全属性拷贝
	// -	扩展that对象，添加更多的属性
	// -	返回that对象
	function triangle(s, h) {
		var that = object(twoD);
		that.name = 'Trangle';
		that.getArea = function() {
			return this.side * this.height / 2;
		};
		that.side = s;
		that.height = h;
		return that;
	}

	// 由于triangle只是一个一般函数，不是构造器，所以调用他通常是不需要new 操作符的。但由于该函数返回的是一个对象，所以即便我们在函数调用时错误的使用了new操作符，他也会按照预定的方式工作
	var t = triangle(5, 10);
	console.log(t.dimensions);

	var t2 = new triangle(5,5);
	console.log(t2.getArea());

	// 要注意的是，这里的that只是一个名字，并不存在与保留字this用法类似的特殊含义
</script>
</body>
</html>